﻿#nullable disable
using Microsoft.AspNetCore.Mvc.Routing;

namespace Web
{
    /// <summary>
    /// 自定义路由，此处是获取二级(或三级)域名的值
    /// </summary>
    class MyRouteValueTransformer : DynamicRouteValueTransformer
    {
        #region 自定义路由，此处是获取二级(或三级)域名的值
        /// <summary>
        /// 自定义路由，此处是获取二级(或三级)域名的值
        /// 并不是最好的方法，但暂时只能这样处理
        /// </summary>
        /// <param name="httpContext">当前请求上下文http对象</param>
        /// <param name="values">路由值</param>
        /// <returns></returns>
        public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
        {
            #region MyRegion
            //通过values可以拿到原始路由数据
            //可以替换或加入新的数据
            //values.Add("controller", "jj");
            //values.Add("action", "kkk");
            //values.Add("appId","123");  
            #endregion

            #region 获取域名
            string requestDomain = httpContext.Request.Headers.Host;//获取域名或用下一行
            //string requestDomain = httpContext.Request.Host;//获取域名
            if (!string.IsNullOrEmpty(requestDomain))
            {
                if (requestDomain.IndexOf(":") > 0)
                {
                    requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
                }
            }
            else
            {
                requestDomain = httpContext.Request.Host.Value;
            }
            #endregion

            #region 截取从0到第一个点之间的部分作为子域名，这里是微信appId
            string _appId = "";
            if (requestDomain.IndexOf(".") > 0)
            {
                _appId = requestDomain.Substring(0, requestDomain.IndexOf("."));
            }
            LogHelper.Info($"域名：{requestDomain},子域名：{_appId}");
            #endregion

            #region 替换值
            //如果endpoints.MapDynamicControllerRoute<MyRouteValueTransformer>("{appId}/{controller=Home}/{action=Index}/{id?}");中配置的有此值
            //if (values.ContainsKey("appId"))
            //{
            //    values["appId"] = _appId;
            //} 
            #endregion

            #region 添加值
            values.Add("appId", _appId);
            #endregion

            return new ValueTask<RouteValueDictionary>(values);
        }
        #endregion
    }
}
